package Test;

import static org.junit.Assert.*;

import java.util.ArrayList;

import org.junit.Test;

import system.Input;
import system.Lugar;
import system.Maquina;
import system.Output;
import system.Robot;
import system.Sistema;

public class TestRobots {

	Robot r = new Robot(null, null, null);
	@Test
	public void testMoverDeInventarioAMaquina(){
		Input i = new Input(null, null);
		Maquina m = new Maquina(null, null);
		
		int a = i.getCantPiezas();
		int b = m.getCantPiezas();
		
		r.mover(i, m);
		
		
		assertEquals("el inventario no se decremento", true, a == i.getCantPiezas()+1);
		assertEquals("la maquina no se incremento", true, b == m.getCantPiezas()-1);
		
		
		
	}
	
	@Test
	public void testMoverDeMaquinaAMaquina(){
		Maquina m1 = new Maquina(null, null);
		Maquina m2 = new Maquina(null, null);
		
		int a = m1.getCantPiezas();
		int b = m2.getCantPiezas();
		
		r.mover(m1, m2);
		
		
		assertEquals("la maquina origen no se decremento", true, a == m1.getCantPiezas()+1);
		assertEquals("la maquina destino no se incremento", true, b == m2.getCantPiezas()-1);
		
		
		
	}
	
	@Test
	public void testMoverDeMaquinaAObjetivo(){
		Output o = new Output(null, null);
		Maquina m = new Maquina(null, null);
		
		int a = o.getCantPiezas();
		int b = m.getCantPiezas();
		
		r.mover(m, o);
		
		
		assertEquals("la maquina no se decremento", true, a == m.getCantPiezas()+1);
		assertEquals("el objetivo no se incremento", true, b == o.getCantPiezas()-1);
		
		
		
	}
	
	@Test
	public void testSacar(){

		
		Maquina m = new Maquina(null, null);
		Input i = new Input(null, null);
		Output o = new Output(null, null);
		
		m.incCantPiezas();
		o.incCantPiezas();
		
		r.sacar(i);
		r.sacar(m);
		r.sacar(o);
		
		assertEquals("la cantidad en la maquina no se decremento", 0, m.getCantPiezas());
		assertEquals("la cantidad en el inventario no se decremento", 9998, i.getCantPiezas());
		assertEquals("la cantidad en el objetivo no se decremento", 0, o.getCantPiezas());
		
		
	}
	
	@Test
	public void testColocar(){
		
		
		Maquina m = new Maquina(null, null);
		Output o = new Output(null, null);
		
		r.colocar(m);
		r.colocar(o);
		
		assertEquals("la cantidad en la maquina no se incremento", 1, m.getCantPiezas());
		assertEquals("la cantidad en el objetivo no se incremento", 1, o.getCantPiezas());
	}
	/**
	 * los siguientes tests no dicen nada por ahora porque lo unico que cambia en los 
	 * robots la alcanzabilidad es el hecho que tienen un atributo mas.
	 * No los limita de ningun modo a sacar piezas de cualquier lado y 
	 * ponerlas en cualquier otro, esa funcionalidad todavia no la implementamos, no 
	 * obstante los tests ya estaran hechos para ese entonces.
	 */
	
	@Test
	public void testAlcanzabilidad() {
		
		
		Maquina m1 = new Maquina(null, null);
		Maquina m2 = new Maquina(null, null);
		
		ArrayList<Lugar> lista1 = new ArrayList<Lugar>();
		
		lista1.add(m1);
		lista1.add(m2);
		
		Robot r1 = new Robot(null,null,lista1);
		
		r1.mover(m1, m2);
		
		assertEquals("el robot no alcanza a lugares a los que deberia alcanzar", 1 , m2.getCantPiezas());
		
		
		
	}
	/**
	 * este test siguiente no dara resultado exitoso hasta que no se implementen
	 * los arraylist en la clase robot de forma que limiten su alcanzabilidad fisica
	 */
	//@Test
	public void negativeTestAlcanzabilidad(){
		
		Maquina m1 = new Maquina(null, null);
		Maquina m2 = new Maquina(null, null);
		
		ArrayList<Lugar> lista1 = new ArrayList<Lugar>();
		
		lista1.add(m1);
		
		Robot r1 = new Robot(null,null,lista1);
		
		int a = m2.getCantPiezas();
		r1.sacar(m2);
		
		assertEquals("el robot alcanza a lugares a los que NO deberia alcanzar", true ,a == m2.getCantPiezas());
		
		
	}
}